package com.wuba.rxjavademo.tzx.filter;

import com.wuba.rxjavademo.tzx.common.Base;

import rx.Observable;
import rx.functions.Func1;

/**
 * Created by tanzhenxing
 * Date: 2016/6/27.
 * Description:
 * first( ) and takeFirst( ) — 只发射第一项数据，或者满足某种条件的第一项数据
 * firstOrDefault( ) — 只发射第一项数据，如果Observable为空就发射默认值
 *
 * last( ) — 只发射最后的一项数据
 * lastOrDefault( ) — 只发射最后的一项数据，如果Observable为空就发射默认值
 */
public class RxFirstOrLast extends Base {
    public static void main(String[] args) {
        RxFirstOrLast firstOrLast = new RxFirstOrLast();
        firstOrLast.run();
    }

    @Override
    public void run() {
        for (int i = 1; i < 5; i++)
            type(getObservable(),i)
                    .subscribe(Base::print);
    }

    public Observable<Integer> type(Observable<Integer> observable, int type) {
        switch (type) {
            case 0:
                return observable.first();
            case 1:
                return observable.last();
            case 2:
                return observable.takeFirst(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        return integer>2;
                    }
                });
            case 3:
                return observable.firstOrDefault(-1);
            case 4:
                return observable.lastOrDefault(-1);
            default:
                return observable;
        }
    }
}
